/*进程的创建是通过拷贝父进程得到的，会将父进程的0-3G内容
    拷贝到子进程中，只是替换必要的一些部分
*/

/*
#include <unistd.h>
#include <sys/types.h>

pid_t fork(void)
功能
    fork()函数用于在linux系统中创建一个新的进程。
    新进程是调用进程(即父进程)的副本，但是拥有自己唯一的进程ID。
    子进程和父进程在fork()调用之后并发运行，
    他们拥有独立的内存空间和资源，可以执行不同的任务
参数
    无
返回值
    成功  返回值
            父进程：子进程的PID
            子进程：返回0
    失败  返回-1 给父进程 不会创建子进程 重置错误码
*/
#include <unistd.h>
#include <stdio.h>

int main(int argc,char const *argv[])
{
    int fork_num;//用于存储fork()返回值，即子进程的PID或者0

    fork_num = fork();
    //调用fork()创建子进程
    if(-1 == fork_num)
    {
        //如果fork()返回-1，表示创建子进程失败
        perror("fork err:");//输出错误信息，说明为什么创建子进程失败
        return 0;//退出程序，失败时直接返回
    }

    printf("张三李四王五\n");//父进程和子进程都会执行到这里，输出这行信息
    
    if(0 == fork_num)//子进程中执行的代码块,fork_num==0表示是子进程
    {
        printf("我是子进程 fork_num = %d\n",fork_num);//打印出子进程信息
        while(1)//子进程进入一个无限循环，每隔一秒钟休眠一次,模拟子进程的长时间运行
        {
            sleep(1);
        }
    }

    if (0 < fork_num)  // 父进程中执行的代码块，fork_num > 0 表示是父进程
    {
        printf("我是父进程 fork_num = %d\n", fork_num);  // 打印父进程信息，fork_num 为子进程的 PID
        while (1)  // 父进程也进入无限循环，每隔 1 秒钟休眠一次
        {
            sleep(1);  // 让父进程暂停 1 秒钟
        }
    }

    return 0;  // 主程序返回 0，结束执行（但实际上父进程和子进程会一直运行）
}
